home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Tools / TRW2000 for Win9x v1.22 / PLUGSDK / PEDUMP / PEDUMP.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  2000-04-26  |  4.2 KB  |  207 lines

  1. //pe.cpp
  2. #include "basefunc.h"
  3. #include "mype.h"
  4.  
  5.  
  6. void    R3_PEdump_Read(DWORD imte);
  7.  
  8. void writeOBJ(HANDLE h,PBYTE p,DWORD size);
  9. //#include <stdio.h>
  10.  
  11. EXC BYTE DOSEXE;
  12.  
  13. BOOL    cmd_PEdump(int argc,PSTR* argv);
  14. void    cmd_PEdump_( PSTR fname,DWORD imte );
  15.  
  16.  
  17. class CPe_CPP
  18. {
  19. public:
  20.     CPe_CPP();
  21.     ~CPe_CPP();
  22. };
  23. CPe_CPP cinit;    //must have a instance data
  24.  
  25. CPe_CPP::~CPe_CPP()
  26. {
  27. }    
  28.  
  29. CPe_CPP::CPe_CPP()
  30. {
  31.     Add_Command ( "PEDUMP", "[filename] [IMTE]",
  32.     "Dump PE image to 'dump1.exe',or specify file"
  33.     "specify [IMTE] only if you want to dump a 32bit DLL,\n"
  34.     "and make sure the DLL is in current context",
  35.     0,
  36.     cmd_PEdump );
  37.  
  38.     msgl ( "PEDUMP Plugs Initialized..." ) ;
  39. }
  40.  
  41. void writeOBJ(HANDLE h,PBYTE p,DWORD size)
  42. {
  43.     prtl("Writing %x len %x",p,size);
  44.     if( size==0 )
  45.         return;
  46.     while(size> 0x1000){
  47.         fwrite(h,(PVOID)p,0x1000);
  48.         size -= 0x1000;
  49.         p += 0x1000;
  50.         }
  51.     fwrite(h,(PVOID)p,size);
  52. }
  53.  
  54. // ────────────────────────────────────
  55. BOOL    cmd_PEdump(int argc,PSTR* argv)
  56. {
  57.     if( fPM==0 || fUserVM ){
  58.         msgl( "Can not run PEDUMP now" );
  59.         return TRUE;
  60.         }
  61.     PSTR fname = "DUMP1.EXE";
  62.     if( argc>0 )
  63.         fname = arg1;
  64.  
  65.     DWORD imte;
  66.     if( argc==2 )
  67.     {
  68.         DWORD Number;
  69.         if(getNum(arg2,&Number)==FALSE) 
  70.               return FALSE;
  71.         imte = Number;
  72.     }
  73.     else
  74.     {
  75.         DWORD d=pw(Pdb+ MTEindex_in_Pdb_2a);
  76.         imte = (DWORD)PM[d];
  77.     }
  78.             
  79.     Begin_Nest_VMM_Exec();
  80.     R3_PEdump_Read(imte);
  81.     cmd_PEdump_(fname,imte);
  82.     End_Nest_VMM_Exec();
  83.     
  84.     return TRUE;        
  85. }
  86. void    cmd_PEdump_(PSTR fname,DWORD imte)
  87. {
  88.     msgl("PE dump");
  89.  
  90.     DWORD Drva=0,psh,headlen;
  91. //    d=pw(Pdb+ MTEindex_in_Pdb_2a);
  92. //    PIMTE pimte= PM[d];
  93.     PIMTE pimte= (PIMTE)imte;
  94.  
  95.  
  96.     PmyPE oPE = (PmyPE)pimte->pNTHdr;
  97.  
  98. #define base oPE->ImageBase
  99. #define nsec oPE->NumberOfSections
  100. #define align oPE->SectionAlignment
  101.  
  102. // ------------------------------------------
  103. //    DWORD d1=U_getaliase_DS_PageIn(base);
  104. //    d=pd(d1+0x3c);
  105. //    (DWORD)oPE= d1+d;
  106.  
  107.     headlen = oPE->SizeOfOptionalHeader + 24;
  108.     if( headlen!= 0xf8 ){
  109.         prtl("curious!");
  110.         }
  111.     psh = (DWORD)oPE+headlen;
  112.     prtl("VirtualSize RVA PhysicalSize PhysicalOffset");
  113.  
  114. //            27aa 1000 2800  400
  115. //            0069 4000 0200 2c00
  116. //            2264 5000 1000 2e00
  117. //            02b0 8000 0400 3e00
  118. //            0384 9000 0400 4200
  119.  
  120.     prtl("----------");
  121.     {for( int i=0;i<nsec;i++ ){
  122.         PObject_Table p;
  123.         (DWORD &)p=psh+i*40;
  124.         prtl("%8x %8x %8x %8x",
  125.             p->VirtualSize,
  126.             p->RVA,
  127.             p->PhysicalSize,
  128.             p->PhysicalOffset);
  129.  
  130.         p->PhysicalOffset = p->RVA;    //important!!!
  131.         p->PhysicalSize   = p->VirtualSize;    //petite 2.1 need this
  132.         }
  133.     }
  134. // ------------------------------------------
  135.  
  136. //    return 1;
  137.  
  138.     HANDLE h = fopen_create(fname);
  139.     if( DWORD(h)==0)
  140.     {
  141.         return;
  142.     }    
  143.  
  144.     oPE->AddressOfEntryPoint = User_EIP - base;
  145.  
  146.     DWORD len=0x80+headlen+nsec*40;
  147.     msgl("Writing DOS head");
  148.       fwrite(h,&DOSEXE,0x80);
  149.  
  150.     prtl("Writing PE head, from %x, len %x+%x",oPE,headlen,nsec*40);
  151.     fwrite(h,oPE,headlen);                    //write PE head
  152.     fwrite(h,(PSTR)psh,nsec*40);
  153. //    writeOBJ(h,(PSTR)base,oPE->OptionalHeader.SizeOfImage);
  154. //    writeOBJ(h,(PSTR)base+len,
  155. //        oPE->OptionalHeader.SizeOfImage -len );
  156.     DWORD d_max=0;
  157.     {for( int i=0;i<nsec;i++ ){
  158.         PObject_Table p;
  159.         (DWORD &)p=psh+i*40;
  160.         DWORD d=p->RVA + p->VirtualSize;
  161.         if( d > d_max )
  162.             d_max=d;
  163.         }
  164.     }
  165.     writeOBJ(h,(PBYTE)base+len, d_max -len );
  166.  
  167.     fclose(h);
  168. }
  169.  
  170. EXC    void    R3_read(PVOID p,DWORD len);
  171.  
  172. void    R3_PEdump_Read(DWORD imte)
  173. {
  174.     DWORD d=0,Drva=0,psh,headlen;
  175. //    d=pw(Pdb+ MTEindex_in_Pdb_2a);
  176. //    PIMTE pimte= PM[d];
  177.     PIMTE pimte= (PIMTE)imte;
  178.  
  179.     PmyPE oPE = (PmyPE)pimte->pNTHdr;
  180.  
  181. #define base oPE->ImageBase
  182. #define nsec oPE->NumberOfSections
  183. #define align oPE->SectionAlignment
  184.  
  185. // ------------------------------------------
  186. //    DWORD d1=U_getaliase_DS_PageIn(base);
  187. //    d=pd(d1+0x3c);
  188. //    (DWORD)oPE= d1+d;
  189.  
  190.     headlen = oPE->SizeOfOptionalHeader + 24;
  191.     psh = (DWORD)oPE+headlen;
  192.  
  193.     DWORD len=0x80+headlen+nsec*40;
  194.     R3_read(oPE,headlen);                    //write PE head
  195.     R3_read((PSTR)psh,nsec*40);
  196.     DWORD d_max=0;
  197.     {for( int i=0;i<nsec;i++ ){
  198.         PObject_Table p;
  199.         (DWORD &)p=psh+i*40;
  200.         DWORD d=p->RVA + p->VirtualSize;
  201.         if( d > d_max )
  202.             d_max=d;
  203.         }
  204.     }
  205.     R3_read((PSTR)base+len,    d_max -len );
  206. }
  207.